/*
 * @Description: 请求封装
 *
 * @Date: 2021-03-02 10:42:00
 */

import axios from 'axios'
import qs from 'qs'
import store from './../store'
import { getToken } from '@/utils/auth'
// 引入配置文件
import baseConfig from '@/config/config.base'
const isDev = process.env.NODE_ENV === 'development'
function getRequestUrl(url) {
	if (isDev) {
		return url
	}
	return baseConfig.baseURL + url
}
// 创建一个请求对象
let axiosX = axios.create({
	baseURL: '',
	timeout: 1000 * 60 * 30, // 请求超时时间60毫秒
})

// request 拦截
axiosX.interceptors.request.use(
	(config) => {
		config.headers['version'] = 'v1.0.0'
		config.headers['authorization'] = getToken() ? getToken() : ''
		config.headers['appid'] = baseConfig.appId
		if(config.token !== undefined && config.token !== ''){
			config.headers['authorization'] = "Bearer "+config.token;
		}
		// console.log('-------------config-----------------');
		// console.log(config);
		return config
	},
	(err) => {
		return Promise.reject(err)
	}
)

// response 拦截
axiosX.interceptors.response.use(
	(response) => {
		const code = response.data.code
		// 如果未返回 body 体
		if (!response.data) {
			console.log('系统繁忙！请稍后再试！')
		}
		// 如果登录信息失效
		if (code === '0000002' || code === '0000001') {
			console.log('登录失效!')
			store.dispatch('auth/logout')
		}
		let res = response
		return res
	},
	(error) => {
		// 如果401 token过期
		if (error.response && error.response.status === 401) {
			console.log('登录失效!')
			store.dispatch('auth/logout')
		}
		// 如果服务器返回500错误
		if (error.response && error.response.status === 500) {
			console.log('系统错误!')
		}
		return Promise.reject(error)
	}
)

/**
 * @param {string}  method   请求方法
 * @param {string}  url      请求地址
 * @param {Object}  params    请求参数
 * @param {Boolean} stringify 是否格式化参数
 */
function XHR(url, { method = 'get', params = {}, stringify = true, options = {} }) {
	url = getRequestUrl(url)
	// 格式化参数
	let fromData = method === 'get' ? { params, ...options } : params
	// console.log('-------------options----------------');
	// console.log(options);
	// 如果开启格式参数，且请求为 post
	if (['post', 'delete'].includes(method) && stringify) {
		fromData = qs.stringify(fromData)
	}
	if (['delete'].includes(method)) {
		fromData = { data: fromData }
	}
	// 返回结果
	return new Promise((resolve, reject) => {
		axiosX[method](url, fromData, options)
			.then((res) => {
				resolve(res)
			})
			.catch((error) => {
				reject(error)
			})
	})
}

/**
 * GET 请求
 * @param {String} url 地址
 * @param {Object} params 参数
 * @param {Object} options 请求头设置
 */
export function axiosGet(url, params, options) {
	return XHR(url, { method: 'get', params, options })
}

/**
 * POST 请求
 * @param {String} url 地址
 * @param {Object} params 参数
 * @param {Boolean} stringify 是否格式化参数, formdata表单形式
 * @param {Object} options 请求头设置
 */
export function axiosPost(url, params, stringify = false, options) {
	return XHR(url, { method: 'post', params, options, stringify })
}
/**
 * DELETE 请求
 * @param {String} url 地址
 * @param {Object} params 参数
 * @param {Boolean} stringify 是否格式化参数, formdata表单形式
 * @param {Object} options 请求头设置
 */
export function axiosDelete(url, params, stringify = false, options) {
	return XHR(url, { method: 'delete', params, options, stringify })
}
export default function (Vue) {
	// 注入未封装的原始请求
	Vue.prototype.$axios = axiosX
	// 注入封装好的请求
	Vue.prototype.$http = {
		get: axiosGet,
		post: axiosPost,
		delete: axiosDelete,
	}
}
